package code

import (
	"errors"
	//"fmt"
)
//队列先进先出的数据结构  通常的实现方式有 数组和链表两种方式
//队列一般只要两个操作  入对peek 和出对put
//队列一般有两个标记  队头 head 和队尾 tail
//循环队列总是会少一个元素

type Queue struct {
	data []interface{} //int队列
	head int
	tail int
			   //num  int64
}

func NewQueue(cap int) *Queue {
	return &Queue{data:make([]interface{}, cap + 1)}

}

//入队列
func (q *Queue)Put(item interface{}) error {
	if (q.tail + 1) % len(q.data) == q.head {
		return errors.New("队列已经满了...")
	}
	q.data[q.tail] = item
	q.tail = (q.tail + 1) % len(q.data)
	return nil
}

//获取对头 不出队列
func (q *Queue)Peek() interface{} {
	if q.tail == q.head {
		return nil
	}
	return q.data[q.head]

}

func (q *Queue)Poll() interface{} {
	if q.head == q.tail {
		return nil
	}
	re := q.data[q.head]
	q.data[q.head] = nil
	q.head = (q.head + 1) % len(q.data)
	return re

}

func (q *Queue)IsEmpty() bool {
	if q.head == q.tail {
		return true
	}
	return false
}

func (q *Queue)IsFull() bool {
	if ((q.tail + 1) % len(q.data)) == q.head {
		return true
	}
	return false
}

func (q *Queue)Size() int {
	if q.tail >= q.head {
		return q.tail - q.head
	}
	return q.tail + len(q.data) - q.head

}